package com.单例设计模式;

public class 懒汉式 {
    //饿汉式在类加载的时候就创建对象，即使你调用静态属性，也得创建对象，造成了资源的浪费，进而推出(懒汉式)
    // 懒汉式在调用getInstance的时候才创建对象，调用属性不会创建对象；
    public static void main(String[] args) {
        System.out.println(Cat.age);  // 打印age属性，不会创建对象

        Cat cat1 = Cat.getCat();    // 调用getCat方法，创建对象
        System.out.println(cat1);

        Cat cat2 = Cat.getCat();  // 调用getCat方法，不会创建对象，因为cat不为null，直接返回cat；
        System.out.println(cat2);  // cat1和cat2是同一个对象

        System.out.println(cat1 == cat2);  // true

    }
}

//希望在程序运行过程中，只创建一个Cat对象
//使用单例模式
class Cat{
    private String name;
    public static int age = 3;
    private static Cat cat;

    //1.私有化构造器, 保证外部不能new对象
    private Cat(String name) {
        System.out.println("构造器被调用");
        this.name = name;

    }

    public static Cat getCat(){//2.提供外部获取Cat对象的静态方法,在类加载的时候不会创建对象，只有在调用getCat方法时才创建对象

        if(cat == null){  //如果cat为null，才创建对象，如果cat被创建过则不再创建返回cat,从而保证对象的唯一性；
            cat = new Cat("小花猫");
        }
        return cat;
    }



    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                '}';
    }
}